package cn.dujy.derby.handler;

import cn.dujy.mybatis.constants.ExceptionEnum;
import cn.dujy.mybatis.errors.InternalServerErrorException;
import cn.dujy.mybatis.utils.pack.PackResponseResult;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * 这是一个异常处理类，将业务中的异常代码抽出，放在这里。相当于异常的aop
 * </p>
 *
 * @author 杜家源
 * @相关解释： <p>
 * RestControllerAdvice——贴在类上，这个类就可以在controller的方法执行前，或者执行后做一些事情
 * </p>
 * <p>
 * ExceptionHandler(想要拦截的异常名.class)——拦截异常 : 这个注解就可以拦截器 自定义和 Exception异常
 * </p>
 * @since 2023-10-23
 */
@Slf4j
@RestControllerAdvice
public class ExceptionHandle {

    /**
     * 拦截器其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public PackResponseResult exception(Exception e) {
        e.printStackTrace();
        return PackResponseResult.error(e.getMessage(), ExceptionEnum.SYSTEM_ERROR.getStatus());
    }

    /**
     * 拦截异常 : 这个注解就可以拦截器 InternalServerErrorException 异常
     * @param e
     * @param response
     * @return
     */
    @ExceptionHandler(InternalServerErrorException.class)
    public PackResponseResult InternalServerErrorException(InternalServerErrorException e, HttpServletResponse response) {
        e.printStackTrace();
        ExceptionEnum exceptionEnum = e.getExceptionEnum();
        if (exceptionEnum == null) {
            return PackResponseResult.error(e.getMessage(), e.getCode());
        }
        return PackResponseResult.error(exceptionEnum);
    }


}

